<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
</head>

<body>
    <script>
        let arr = [1, 2, 3];
        // let arr2 = arr;
        // arr[0] = 10;
        // console.log(arr, arr2);
        //这种情况是一个浅复制 复制的是地址 一个变了另一个也会变

        // 数组的深复制
        // 1. concat
        let arr2 = arr.concat();
        arr[0] = 10;
        console.log(arr, arr2);
        // 2.JSON.parse(JSON.stringify())

        // 对象的深复制
        // 1.JSON.parse(JSON.stringify())
        // 2.递归(一个函数自身调用自身这个叫递归)

        // let obj = {
        //     name: "小明",
        //     age: 18,
        //     friend: [{
        //         name: "后羿",
        //         age: 200,
        //     }, {
        //         name: "马克波罗",
        //         age: 300,
        //     }, ],
        // };
        // let obj2 = obj;
        // obj.friend[0].name = "貂蝉";
        // console.log(obj);
        // console.log(obj2);
        //直接复制是浅复制 一个变另一个跟着变
        // 递归实现深复制：
        // let obj2 = {};
        // for (const key in obj) {
        //     if (obj[key] instanceof Object) {
        //         for (const j in obj[key]) {}
        //         // 如果是对象就又要进行判断
        //     } else {
        //         obj2[key] = obj[key];
        //     }
        // }
        // console.log(obj2);
        // obj2.name = "小丽";
        // console.log(obj, obj2);
        // 封装一个深复制的递归函数：

        let obj = {
            name: "小明",
            age: 18,
            friend: [{
                name: "后羿",
                age: 200,
            }, {
                name: "马克波罗",
                age: 300,
            }, ],
        };
        // 深复制的时候
        // 第一层循环循环 name age friend
        // obj2['name'] = "小明"
        // obj2['age'] = 18
        // 循环到friend的时候 是一个对象 就走if
        // obj2["friend"] = deepCopy(obj["friend"])
        // 接下来循环friend
        // 这个时候 生成一个obj2 但是是局部变量不污染之前
        // obj["friend"][0]
        // obj2[0] =
        //     obj2[1] =

        function deepCopy(obj) {
            let obj2 = {};
            for (const key in obj) {
                if (obj[key] instanceof Object) {
                    //判断数据类型是不是对象类型
                    obj2[key] = deepCopy(obj[key]);
                    //这里用递归调用自身
                } else {
                    obj2[key] = obj[key];
                }
            }
            return obj2;
        }
        let obj2 = deepCopy(obj);
        console.log(obj2);
        obj.friend[0].name = "貂蝉";
        console.log(obj);
        console.log(obj2);

        // for in 循环专门循环对象 数组也可以
        let res = {
            name: "后羿",
            age: 200,
        };
        let res2 = [1, 2, 3, 4];
        for (var key in res) {
            console.log(key);
            console.log(res[key]);
            // key是 属性
            // res[key]是value值
        }
        for (const key in res2) {
            console.log(key);
            console.log(res2[key]);
            // 循环数组 key值是下标
            // res2[key]是值
        }
    </script>
</body>

</html>